class Solution {
public:
    long long maximumOr(vector<int>& nums, int k) {

        // ???nums????1?????
        vector<int> count(32);
        for(int i = 0; i < nums.size(); i++){
            for (int j = 0; j < 32; j++){
                if((nums[i] >> j) & 1){
                    count[j]++;
                }
            }
        }

        // ???????nums[i], ????????????1???????????????????????
        long long res = 0;
        for(int i = 0; i < nums.size(); i++){

            vector other_count = count;

            for(int j = 0;  j < 32; j++){
                if((nums[i] >> j) & 1){
                    other_count[j]--;
                }
            }

            // ??????????????
            int other_num = 0;
            for(int j = 0; j < 32; j++){
                if(other_count[j] > 0){
                    other_num += (1 << j);
                }
            }

            // ????????????????????????nums[i] ????k??????
            long long ans = ((long long) nums[i] << k) | other_num;
            res = max(ans, res);
        }
        return res;
    }
};